/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CapaNegocios;

import controlrestaurante.pmf;
import controlador.OrdenJpaController;
import entidad.Orden;
import controlador.DetalleordenJpaController;
import entidad.Usuarios;
import controlador.MesaJpaController;
import entidad.Mesa;
import controlador.UsuariosJpaController;
import controlador.exceptions.NonexistentEntityException;
import entidad.Bebidas;
import entidad.BebidasHasProducto;
import entidad.DetalleDePlato;
import entidad.Producto;
import entidad.Detalleorden;
import entidad.Platos;
import entidad.Usuarios;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

/**
 *
 * @author Milvia
 */
public class CNOrden {
    
    private static boolean aumentarProducto(Bebidas b,Platos p , Detalleorden l)
    {        
        try
        {
            if(b==null)
                for(DetalleDePlato det: p.getDetalleDePlatoCollection())
                {
                    if(det.getDescuentoAutomatico()!=false)
                    {
                        Producto pro = det.getProducto();
                        pro.setCanitdad(pro.getCanitdad()+Conversor.convertirPlato(pro, det)*l.getCantidad());
                        if(CNProducto.modificar(pro)==false)
                            return false;
                    }
                }
            else
                for(BebidasHasProducto det: b.getBebidasHasProductoCollection())
                {
                    if(det.getDescuentoAutomatico()!=false)
                    {
                        Producto pro = det.getProducto();
                        pro.setCanitdad(pro.getCanitdad()+Conversor.convertirBebida(pro, det)*l.getCantidad());
                        if (CNProducto.modificar(pro)==false)
                            return false;
                    }
                }            
        }
        catch(Exception e)
        {
            return false;
        }
        return true;
    }
    
    private static boolean descontarProductos(Bebidas b,Platos p , Detalleorden l)
    {
        try
        {
            if(b==null)
                for(DetalleDePlato det: p.getDetalleDePlatoCollection())
                {
                    if(det.getDescuentoAutomatico()!=false)
                    {
                        Producto pro = det.getProducto();
                        pro.setCanitdad(pro.getCanitdad()-Conversor.convertirPlato(pro, det)*l.getCantidad());
                        if (CNProducto.modificar(pro)==false)
                            return false;
                    }                    
                }
            else
                for(BebidasHasProducto det: b.getBebidasHasProductoCollection())
                {
                    if(det.getDescuentoAutomatico()!=false)
                    {
                        Producto pro = det.getProducto();
                        pro.setCanitdad(pro.getCanitdad()-Conversor.convertirBebida(pro, det)*l.getCantidad());
                        if (CNProducto.modificar(pro)==false)
                            return false;
                    }
                }            
        }
        catch(Exception e)
        {
            return false;
        }
        return true;
    }
    
    public static boolean insertar(Orden orden)
    {     
        EntityManagerFactory emf =pmf.getInstancia().getEMF();
        EntityManager em = emf.createEntityManager();
        orden.setPagado(Boolean.FALSE);
        orden.setGranTotal(Float.valueOf(0));
        orden.setDescuento(Float.valueOf(0));
        orden.setPropinaTarjeta(Float.valueOf(0));
        orden.setTotalEfectivo(Float.valueOf(0));
        orden.setTotalTarjeta(Float.valueOf(0));
        try{            
            em.getTransaction().begin();
            OrdenJpaController controlador = new OrdenJpaController(emf);
            List<Detalleorden> listaTemp = new ArrayList<Detalleorden>();
            if(orden.getDetalleordenCollection()==null)
            {
                controlador.create(orden);
                return true;
            }
            for(Detalleorden d : orden.getDetalleordenCollection())
                listaTemp.add(d);
            orden.getDetalleordenCollection().clear();
            //Para Que pueda realizar la mostracion de Cocin
            orden.setActivo(false);
            controlador.create(orden);
            for (Detalleorden d: listaTemp)
            {
                try
                {
                    d.setOrdenidOrden(orden);
                    DetalleordenJpaController controladorDetalle = new DetalleordenJpaController(emf);
                    controladorDetalle.create(d);
                    orden.getDetalleordenCollection().add(d);
                    //if(descontarProductos(d.getBebidasIdbebidas(),d.getPlatosidPlatos(), d)==false)
                      //  return false;
                }
                catch (Exception e)
                {
                    return false;
                }
            }
            //para mostrar las comandas en la cocina
            orden.setActivo(true);//da errores
            controlador.edit(orden);
            em.getTransaction().commit();
        }      
        catch (Exception e){
            em.close();
            return false;
        }
        return true;  
    }
    private static boolean insertar(int noOrden, Date fecha, float total, float descuento, float granTotal, boolean cortesia, float totalTarjeta, float totalEfectivo, float propinaTarjeta, String noVoucherTarjeta, int idMesa, int idUsuario, List<Detalleorden> detalles)
    {
        MesaJpaController controladorMesa = new MesaJpaController(pmf.getInstancia().getEMF());
        Mesa mesa = controladorMesa.findMesa(idMesa);
        UsuariosJpaController controladorUsuario = new UsuariosJpaController(pmf.getInstancia().getEMF());
        Usuarios usuario = controladorUsuario.findUsuarios(idUsuario);
        Orden orden = new Orden();
        orden.setNoOrden(noOrden);
        orden.setFecha(fecha);
        orden.setTotal(total);
        orden.setDescuento(descuento);
        orden.setGranTotal(granTotal);
        //orden.setGranTotal(Float.valueOf(0));
        orden.setCortesia(cortesia);
        orden.setTotalTarjeta(totalTarjeta);
        orden.setTotalEfectivo(totalEfectivo);
        orden.setPropinaTarjeta(propinaTarjeta);
        orden.setNoVoucherTarjeta(noVoucherTarjeta);
        orden.setActivo(Boolean.TRUE);
        orden.setPagado(Boolean.FALSE);
        boolean i = insertar(orden);
        for (Detalleorden d: detalles)
        {
            try
            {
                d.setOrdenidOrden(orden);
                DetalleordenJpaController controladorDetalle = new DetalleordenJpaController(pmf.getInstancia().getEMF());
                controladorDetalle.create(d);
                orden.getDetalleordenCollection().add(d);
                if(descontarProductos(d.getBebidasIdbebidas(),d.getPlatosidPlatos(), d)==false)
                        return false;
            }
            catch (Exception e)
            {
                return false;
            }
        }
        i = modificar(orden);
        return i;
    }
    //*********Funciones eliminar***********
    public static boolean eliminarConDescuento(Orden orden)
    {
         boolean i=false;
        try{            
            if(orden.getDetalleordenCollection()!=null)
            for(Detalleorden det : orden.getDetalleordenCollection())
            {
                aumentarProducto(det.getBebidasIdbebidas(), det.getPlatosidPlatos(), det);
                DetalleordenJpaController controladorDetalle = new DetalleordenJpaController(pmf.getInstancia().getEMF());
                controladorDetalle.destroy(det.getIdDetalleOrden());
            }
            i=eliminar(orden.getIdOrden());
        }
        catch (Exception e)
        {
                return false;
        }
        return i;        
    }
    
    private static boolean eliminar(int id)
    {
        boolean i = false;
        try{
            OrdenJpaController controlador = new OrdenJpaController(pmf.getInstancia().getEMF());
            Orden or = CNOrden.buscarId(id);
            for(Detalleorden d :or.getDetalleordenCollection() )
            {
                try
                {
                    DetalleordenJpaController controladorDetalle = new DetalleordenJpaController(pmf.getInstancia().getEMF());
                    aumentarProducto(d.getBebidasIdbebidas(),d.getPlatosidPlatos(), d);
                    controladorDetalle.destroy(d.getIdDetalleOrden());
                }catch(Exception e)
                {                    
                }
            }
            controlador.destroy(id);
            i=true;
        }
        catch (Exception e)
        {
                return false;
        }
        return i;
    }
    
     //******Funciones modificar**********
    public static boolean modificar(Orden orden)
    {
        try{
            pmf.getInstancia().cerrarEMF();
            OrdenJpaController controlador = new OrdenJpaController(pmf.getInstancia().getEMF());
            Orden temporalOrden = controlador.findOrden(orden.getIdOrden());
            DetalleordenJpaController controladorDetalle = new DetalleordenJpaController(pmf.getInstancia().getEMF());
            //verificar si ubo algun cambio en la lista original
            for(Detalleorden temp : temporalOrden.getDetalleordenCollection())
            {
                try
                {
                    boolean eliminar = true;
                    for(Detalleorden d : orden.getDetalleordenCollection())
                    {
                        if(temp.equals(d))
                        {
                            d.setActivo(temp.getActivo());
                            d.setOrdenidOrden(orden);
                            controladorDetalle.edit(d);
                            eliminar = false;
                        }
                    }
                    if(eliminar)
                        controladorDetalle.destroy(temp.getIdDetalleOrden());
                }catch(Exception e){}
            }
            //verificamos nuevos pedidos
            for (Detalleorden d: orden.getDetalleordenCollection())
            {
                try
                {
                    if(d.getIdDetalleOrden()==0)
                    {                        
                        d.setOrdenidOrden(orden);
                        controladorDetalle.create(d);
                        orden.setActivo(Boolean.TRUE);
                    }
                    if(orden.getPagado())
                        descontarProductos(d.getBebidasIdbebidas(), d.getPlatosidPlatos(), d);
                }
                catch (Exception e)
                {
                    return false;
                }
            }
            //verificar si hay detalle pendientes
            for(Detalleorden d: orden.getDetalleordenCollection())
            {
                if(d.getActivo())
                    orden.setActivo(Boolean.TRUE);
            }
            controlador.edit(orden);
        }catch (Exception e){
            return false;
        }
        return true;    
    }
    
    
    ///******** Funciones de busqueda y consultas
    public static Orden buscarId(int id)
    {
        Orden or = null;
        List<Orden> lista= null;
        pmf.getInstancia().cerrarEMF();
        try{
            String qu = "SELECT o FROM Orden o WHERE o.idOrden = :idOrden" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
           quer.setParameter("idOrden", id);
           lista = (List<Orden>)quer.getResultList();
           if(!lista.isEmpty())
               or= lista.get(0);
        }catch(Exception e)
        {
            return null;
        }
        return or;    
    }
    
    public static int regresarNumeroOrde()
    {
        int x=0;
        List <Orden> lista = null ;
        try{
            String qu = "SELECT o FROM Orden o order by o.idOrden DESC" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu).setMaxResults(1);
           lista = (List<Orden>)quer.getResultList();
           if(lista.isEmpty())
               return 1;
           x= lista.get(0).getNoOrden();
           x++;
        }catch(Exception e)
        {
            return 0;
        }
        
        return x;
    }
    
    public static int regresarIdComparador()
    {
        List<Integer> lista= null;
        try{
            String qu = "SELECT o.idOrden FROM Orden o WHERE o.activo=true" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
           lista = (List<Integer>)quer.getResultList();
        }catch(Exception e)
        {
            return 0;
        }
        return lista.size();
    }
    
    public static boolean entradaCocina(int id)
    {
        boolean h=false;
        Orden or = CNOrden.buscarId(id);
        DetalleordenJpaController controladorDetalle = new DetalleordenJpaController(pmf.getInstancia().getEMF());
        if(or!=null)
        {
            for(Detalleorden temp : or.getDetalleordenCollection())
            {
                temp.setActivo(true);
                try {
                    controladorDetalle.edit(temp);
                } catch (NonexistentEntityException ex) {
                    Logger.getLogger(CNOrden.class.getName()).log(Level.SEVERE, null, ex);
                } catch (Exception ex) {
                    Logger.getLogger(CNOrden.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            or.setActivo(true);
            if(CNOrden.modificar(or))
                return true;
            else
                return false;
        }
        return h;
    }
    
    public static boolean salidaCocina(int id)
    {
        boolean h=false;
        pmf.getInstancia().cerrarEMF();
        Orden or = CNOrden.buscarId(id);        
        DetalleordenJpaController controladorDetalle = new DetalleordenJpaController(pmf.getInstancia().getEMF());
        if(or!=null)
        {
            for(Detalleorden temp : or.getDetalleordenCollection())
            {
                temp.setActivo(false);
                try {
                    controladorDetalle.edit(temp);
                } catch (NonexistentEntityException ex) {
                    Logger.getLogger(CNOrden.class.getName()).log(Level.SEVERE, null, ex);
                } catch (Exception ex) {
                    Logger.getLogger(CNOrden.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            or.setActivo(false);
            if(CNOrden.modificar(or))
                return true;
            else
                return false;
        }
        return h;
    }
    
    public static List<Orden> buscarActivos()
    {
        List<Orden> lista = null;
        try{
            String qu = "SELECT  a FROM Orden a  " 
            + " WHERE a.activo = :activo" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
           quer.setParameter("activo", true);
           lista = (List<Orden>)quer.getResultList();
        }
        catch(Exception e)
        {
            return null;
        }
        return lista;
    }
    
    public static List<Detalleorden> buscarDetalle(Orden idOrden)
    {
        List<Detalleorden> tempList = new ArrayList<Detalleorden>();
            String qu = "SELECT d FROM Detalleorden d WHERE d.activo = :activo" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
           quer.setParameter("activo", true);
           List<Detalleorden> tempoList = (List<Detalleorden>)quer.getResultList();
            if(tempoList!=null)
                for( Detalleorden detalle : tempoList)
                {
                    if(detalle.getOrdenidOrden().getIdOrden() == idOrden.getIdOrden())
                        tempList.add(detalle);
                }
                
         return tempList;
    }
    
    public static List<Orden> buscarPagados()
    {
        List<Orden> lista = (List) Consultas.consulta("Orden", "findByPagado", "pagado", false);
        return lista;
    }
    
    public static List<Orden> buscarInactivos()
    {
        List<Orden> lista = (List) Consultas.consulta("Orden", "findByActivo", "activo", false);
        return lista;
    }
    public static List<Orden> buscarTodos()
    {
        List<Orden> lista = new OrdenJpaController(pmf.getInstancia().getEMF()).findOrdenEntities();
        return lista;
    }
    
    public static List<Orden> buscarNoOrden(int orden)
    {
        List<Orden> lista = (List) Consultas.consulta("Orden", "findByNoOrden", "noOrden", orden);
        return lista;
    }
    public static List<Orden> buscarUsuario(int usuario)
    {
        List<Orden> lista = null;
        try{
           String qu = "SELECT  a FROM Orden a  " 
            + " WHERE a.usuarioidUsuario.idUsuarios = :id" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
           quer.setParameter("id", usuario);
           lista = (List<Orden>)quer.getResultList();
        }
        catch(Exception e)
        {
            return null;
        }
        return lista;
    }
    
    public static List<Orden> buscarFecha(Date fecha)
    {
        List<Orden> lista= (List) Consultas.consulta("Orden", "findByFecha", "fecha", fecha);        
        return lista;
    }
    
    public static List<Orden> buscarFechaRango(Date fecha1, Date fecha2)
    {
        List<Orden> lista=null;
        try{
           String qu = "SELECT  a FROM Orden a  " 
            + " WHERE a.fecha BETWEEN :fecha1 and :fecha2" ;
           Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
           quer.setParameter("fecha1", fecha1);
           quer.setParameter("fecha2", fecha2);
           lista = (List<Orden>)quer.getResultList();
        }
        catch(Exception e)
        {
            return null;
        }
        return lista;
    }
    public static List<Orden> buscarParametros(Date fecha1, Date fecha2,int usuario,String orden)
    {
        List<Orden> lista=null;
        try{
            if(!orden.equals(""))
                return buscarNoOrden(Integer.parseInt(orden));
        }
        catch (Exception e)
        {
            lista=null;
        }
        if(usuario!=0&& fecha1==null&& fecha2 ==null)
            return buscarUsuario(usuario);
        else if(usuario!=0&&fecha2==null)
        {
            try{
                String qu = "SELECT  a FROM Orden a  " 
                 + " WHERE a.fecha =:fecha1 and a.usuarioidUsuario.idUsuarios = :id" ;
                Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
                quer.setParameter("fecha1", fecha1);
                quer.setParameter("id", usuario);
                lista = (List<Orden>)quer.getResultList();
                return lista;
             }
             catch(Exception e)
             {
             }
        }
        else if(usuario!=0&&fecha1!=null && fecha2!=null)
        {
            try{
                String qu = "SELECT  a FROM Orden a  " 
                 + " WHERE  a.fecha >=:fecha1 and a.fecha <=:fecha2 and a.usuarioidUsuario.idUsuarios = :id" ;
                Query quer = pmf.getInstancia().getEMF().createEntityManager().createQuery(qu);
                quer.setParameter("fecha1", fecha1);
                quer.setParameter("fecha2", fecha2);
                quer.setParameter("id", usuario);
                lista = (List<Orden>)quer.getResultList();
                return lista;
             }
             catch(Exception e)
             {
             }
        }
        if(usuario==0 && fecha1!=null&& fecha2==null)
            return buscarFecha(fecha1);
        else if(usuario==0 && fecha1!=null && fecha2 !=null)
            return buscarFechaRango(fecha1, fecha2);
        return buscarTodos();
    }
    
    public static float corteDeVentasEfectivo(Date dia)
    {
        float corte=0;
        List<Orden> lista = null;
        lista = CNOrden.buscarFecha(dia);
        if(lista==null)
            return 0;
        for(Orden temp:lista)
        {
            corte = corte+temp.getTotalEfectivo();
        }
        return corte;
    }
    
    public static float corteDeVentasTarjeta(Date dia)
    {
        float corte=0;
        List<Orden> lista = null;
        lista = CNOrden.buscarFecha(dia);
        if(lista==null)
            return 0;
        for(Orden temp:lista)
        {
            corte = corte+temp.getTotalTarjeta();
        }
        return corte;
    }
    public static float corteDeVentasPropina(Date dia)
    {
        float corte=0;
        List<Orden> lista = null;
        lista = CNOrden.buscarFecha(dia);
        if(lista==null)
            return 0;
        for(Orden temp:lista)
        {
            corte = corte+temp.getPropinaTarjeta();
        }
        return corte;
    }
    
}
